package com.version1.diabeco.ui.glucosa;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import kankan.wheel.widget.OnWheelChangedListener;
import kankan.wheel.widget.WheelView;
import kankan.wheel.widget.adapters.NumericWheelAdapter;
import kankan.wheel.widget.adapters.WheelViewAdapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.speech.RecognizerIntent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.version1.diabeco.ActivityMain;
import com.version1.diabeco.DateArrayAdapter;
import com.version1.diabeco.DateNumericAdapter;
import com.version1.diabeco.R;
import com.version1.diabeco.data.ajustes.perfilusuario.PerfilUsuarioDaoImpl;
import com.version1.diabeco.data.glucosa.GlucosaDaoImpl;
import com.version1.diabeco.model.ajustes.perfilusuario.PerfilUsuario;
import com.version1.diabeco.model.glucosa.Glucosa;



public class ActivityRegistroGlucosa extends Activity {

	private static final int REQUEST_CODE_GLUCEMIA = 1234;
	private static final int REQUEST_CODE_NOTA = 5678;
	private static final float PORCENTAJE_RIESGO_MEDIO = 0.15f;
	static final String RIESGO_BAJO = "Bajo", 
					    RIESGO_MEDIO = "Medio", 
					    RIESGO_ALTO_SOBRE = "Alto, sobre el Umbral",
					    RIESGO_ALTO_BAJO = "Alto, bajo el Umbral";
			
	Button btnFecha, btnHora;
	EditText editTextGlucemia, editTextNotas;  
	Spinner spinnerMomento, spinnerCuando, spinnerObservaciones, spinnerMujer;
	TextView textViewMujer;
	int intCreando = 1;
	Calendar objCalendario;
	Intent intentGlucosaNueva;
	private PerfilUsuario objPerfilUsuario;

	public static final String INTENT_VALUE_GLUCOSA = "Glucosa";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_registro_glucosa);
				//Cargamos el Perfil de Usuario de la Base de Datos
				objPerfilUsuario = PerfilUsuarioDaoImpl.getInstance(this).selectUsuarioActivo();

				// Elementos de la Pantalla
				btnFecha 	   = (Button) findViewById(R.id.btnFecha);
				btnHora 	   = (Button) findViewById(R.id.btnHora);
				spinnerMomento = (Spinner) findViewById(R.id.spinnerMomento);
				spinnerCuando  = (Spinner) findViewById(R.id.spinnerCuando);
				spinnerObservaciones = (Spinner) findViewById(R.id.spinnerObservaciones);
				editTextGlucemia = (EditText) findViewById(R.id.editTextGlucemia);
				editTextNotas 	 = (EditText) findViewById(R.id.editTextNotas);
				textViewMujer    = (TextView) findViewById(R.id.textViewMujer);
				spinnerMujer 	 = (Spinner) findViewById(R.id.spinnerMujer);
				objCalendario = Calendar.getInstance();
				
				//Ocultamos el combo "Mujer" segun los Ajustes del Usuario
				if (objPerfilUsuario!=null) {
					if (objPerfilUsuario.getSexo().equals(ActivityMain.SEXO_HOMBRE)) {
						spinnerMujer.setEnabled(false);
						spinnerMujer.setVisibility(View.INVISIBLE);
						textViewMujer.setVisibility(View.INVISIBLE);
					} else {
						spinnerMujer.setEnabled(true);
						spinnerMujer.setVisibility(View.VISIBLE);
						textViewMujer.setVisibility(View.VISIBLE);
					}
				}
				
				//Obtenemos el Intent
				intentGlucosaNueva = getIntent();
		       	Glucosa glucosa = (Glucosa) intentGlucosaNueva
		       				.getSerializableExtra(ActivityRegistroGlucosa.INTENT_VALUE_GLUCOSA);
		        
		       	//Posicionamos los Spinners
				posicionarSpinner(glucosa.getMomento(), spinnerMomento);
		       	posicionarSpinner(glucosa.getCuando(), spinnerCuando);
				posicionarSpinner(glucosa.getObservaciones(), spinnerObservaciones);
				posicionarSpinner(glucosa.getMujer(), spinnerMujer);

		        
				//Cargamos los Edit Text
				if (glucosa.getCantidad()!=null) {
					editTextGlucemia.setText(glucosa.getCantidad().toString());					
				}
				
				if (glucosa.getNotas()!=null) {
					editTextNotas.setText(glucosa.getNotas());					
				}
				
				
		     	// Cargamos la fecha y la Hora
				cargarBtnFecha(glucosa.getFecha());
				cargarBtnHora(glucosa.getFecha());
	}

	void posicionarSpinner(String texto, Spinner combo) {

		if (texto != null) {
			ArrayAdapter myAdap = (ArrayAdapter) combo.getAdapter();
			int spinnerPosition = myAdap.getPosition(texto);
			combo.setSelection(spinnerPosition);
		}
	}
	


	/** Carga la Fecha actual y grisa el campo si recibe la fecha por parametro **/
	void cargarBtnFecha(Long fecha) {
		int intDia, intMes, intAno;

		if (fecha == null) {
			// Agregamos la fecha actual y llamamos al DatePicketDialog
			intDia = objCalendario.get(Calendar.DAY_OF_MONTH);
			intMes = objCalendario.get(Calendar.MONTH) + 1;
			intAno = objCalendario.get(Calendar.YEAR);

			btnFecha.setText(new StringBuilder().append(intDia).append("/").
												 append(intMes).append("/").
												 append(intAno).append(" "));
		} else {
			btnFecha.setText(ActivityMain.DATE_FORMAT.format(new Date(fecha)));
			btnFecha.setEnabled(false);
		}
	}

	
	/** Carga la Hora actual y grisa el campo **/
	void cargarBtnHora(Long hora) {
		int intHora, intMinuto;

		if (hora == null) {
			// Agregamos la fecha actual y llamamos al DatePicketDialog
			objCalendario = Calendar.getInstance();
			intHora = objCalendario.get(Calendar.HOUR_OF_DAY);
			intMinuto = objCalendario.get(Calendar.MINUTE);
			
			CharSequence strHora = "", strMinuto = "";			
			if (intHora < 10) {
				strHora = new StringBuilder().append(0).append(intHora);
			} else {
				strHora = new StringBuilder().append(intHora);
			}

			if (intMinuto < 10) {
				strMinuto = new StringBuilder().append(0).append(intMinuto);
			} else {
				strMinuto = new StringBuilder().append(intMinuto);
			}
			
			btnHora.setText(new StringBuilder().append(strHora).append(":").append(strMinuto));
		} else {
			btnHora.setText(ActivityMain.TIME_FORMAT.format(new Date(hora)));
			btnHora.setEnabled(false);
		}
	}
	
	
	/** Se llama al hacer click en "Guardar" */
	public void GlucosaBtnGuardar(View view) {
		float floatGlucemia;
		String strGlucemia = "";
		int banderaError = 0;
		Resources res = getResources();
		strGlucemia = editTextGlucemia.getText().toString();
		
		if (strGlucemia.length() == 0) {
			banderaError = 1;
			editTextGlucemia.setError(res.getString(R.string.msg_glucemia));
		} else {
    		try {
    			floatGlucemia = Float.valueOf(strGlucemia);
    			}
    			catch (NumberFormatException e)
    			{
    				banderaError = 1;
    				editTextGlucemia.setError(res.getString(R.string.msg_solo_numeros));
    			}
		}
		
		if (banderaError == 0) {
			grabarGlucemia();
		}
	}

	
	private void grabarGlucemia() {
		int banderaSugerencia = 0;
		Float riesgoBajoBajo = 0f, riesgoBajoAlto = 0f;
		SharedPreferences diabecoPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());


		  //Obtenemos el Intent
		intentGlucosaNueva = getIntent();
		Glucosa glucosa = (Glucosa) intentGlucosaNueva
   				.getSerializableExtra(ActivityRegistroGlucosa.INTENT_VALUE_GLUCOSA);
		
		//Alias
		glucosa.setAlias(objPerfilUsuario.getId());
		
		//Cantidad
		float cantidad = Float.valueOf(editTextGlucemia.getText().toString());
		glucosa.setCantidad(cantidad);

		//Unidad de Glucosa
		String umGlucosa = objPerfilUsuario.getUmGlucosa();
		glucosa.setUmGlucosa(umGlucosa);
		
		//Nivel Riesgo
		Float umbralBajo = objPerfilUsuario.getUmbralBajo();
		Float umbralAlto = objPerfilUsuario.getUmbralAlto();
		riesgoBajoBajo = (umbralBajo * (1F + PORCENTAJE_RIESGO_MEDIO));
		riesgoBajoAlto = (umbralAlto * (1F - PORCENTAJE_RIESGO_MEDIO));

		if (cantidad >= riesgoBajoBajo && cantidad <= riesgoBajoAlto) {
			glucosa.setNivelRiego(RIESGO_BAJO);
			glucosa.setIconResourceId(R.drawable.ic_semaforo_verde);
		} else {
			if (cantidad >= umbralBajo && cantidad <= umbralAlto) {
			glucosa.setNivelRiego(RIESGO_MEDIO);
			glucosa.setIconResourceId(R.drawable.ic_semaforo_amarillo);
			} else {
				if (cantidad > umbralAlto) {
				glucosa.setNivelRiego(RIESGO_ALTO_SOBRE);
				glucosa.setIconResourceId(R.drawable.ic_semaforo_rojo);

					boolean sugActFisica = diabecoPrefs.getBoolean("checkbox_sugerencia_act_fisica",false);
					if (sugActFisica) {
						sugerenciaActividadFisica(cantidad, umbralAlto);
						banderaSugerencia = 1;					
					}

				} else {
					if (cantidad < umbralBajo) {
					glucosa.setNivelRiego(RIESGO_ALTO_BAJO);
					glucosa.setIconResourceId(R.drawable.ic_semaforo_rojo);
					
						boolean sugComida = diabecoPrefs.getBoolean("checkbox_sugerencia_comida",false);
						if (sugComida) {
							mostrarSugerencia(R.string.mensaje_glucemia_baja);
							banderaSugerencia = 1;						
						}
	
					}		
				}
			}
		}
		
		
		//Momento
		String momento = spinnerMomento.getSelectedItem().toString(); 
		glucosa.setMomento(momento);

		//Cuando
		String cuando = spinnerCuando.getSelectedItem().toString(); 
		glucosa.setCuando(cuando);

		//Observaciones
		String observaciones = spinnerObservaciones.getSelectedItem().toString(); 
		glucosa.setObservaciones(observaciones);		
		
		//Mujer
		String mujer = spinnerMujer.getSelectedItem().toString(); 
		glucosa.setMujer(mujer);
		
		//Notas
		String notas = editTextNotas.getText().toString();
		glucosa.setNotas(notas);
		
		//Pasamos la fecha y la hora
		String strDia = (String) btnFecha.getText();
		String strHora = (String) btnHora.getText();

		Date dia;
		Date hora;
		try {
			dia = ActivityMain.DATE_FORMAT.parse(strDia);
			hora = ActivityMain.TIME_FORMAT.parse(strHora);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(hora);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int minutes = calendar.get(Calendar.MINUTE);

		calendar.setTime(dia);
		calendar.set(Calendar.HOUR, hour);
		calendar.set(Calendar.MINUTE, minutes);
		
		glucosa.setFecha(calendar.getTimeInMillis());

		//Grabamos
		GlucosaDaoImpl.getInstance(this).save(glucosa);

		// Salimos
		if (banderaSugerencia == 0) {
			Toast.makeText(this, "Glucemia Guardada", Toast.LENGTH_SHORT).show();
			this.finish();			
		}


	}

	private void sugerenciaActividadFisica(float cantidad, Float umbralAlto) {
		float riesgoBajo = umbralAlto * (1 + PORCENTAJE_RIESGO_MEDIO);
		
		if (cantidad <= riesgoBajo) {
			mostrarSugerencia(R.string.mensaje_glucemia_alta1);
		} else { 
			mostrarSugerencia(R.string.mensaje_glucemia_alta2);
		}
	}

	/** Se llama al hacer click en "Cancelar" */
	public void GlucosaBtnCancelar(View view) {
		Toast.makeText(this, "Operacion Cancelada", Toast.LENGTH_SHORT).show();
		this.finish();
	}
	
	
	/** Se llama al hacer click en el Boton "Hora" */
	public void ClickHora(View v) {
		LayoutInflater inf = LayoutInflater.from(this);

		// Layout que contiene los wheel's
		View view = inf.inflate(R.layout.wheeltime, null);

		// Hora wheel
		final WheelView hours = (WheelView) view.findViewById(R.id.hours);
		hours.setViewAdapter(new NumericWheelAdapter(this, 0, 23));
		hours.setCyclic(true);
		hours.setCurrentItem(objCalendario.get(Calendar.HOUR_OF_DAY));

		// Minutos wheel
		final WheelView mins = (WheelView) view.findViewById(R.id.minutes);
		mins.setViewAdapter(new NumericWheelAdapter(this, 0, 59));
		mins.setCyclic(true);
		mins.setCurrentItem(objCalendario.get(Calendar.MINUTE));

		// Dialogo
		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_hora).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						CharSequence strHora = "", strMinuto = "";
						
						int hora = hours.getCurrentItem();
						if (hora < 10) {
							strHora = new StringBuilder().append(0).append(hora);
						} else {
							strHora = new StringBuilder().append(hora);
						}
						
						int minuto = mins.getCurrentItem();
						if (minuto < 10) {
							strMinuto = new StringBuilder().append(0).append(minuto);
						} else {
							strMinuto = new StringBuilder().append(minuto);
						}
						btnHora.setText(new StringBuilder().append(strHora).append(":").append(strMinuto));
					}
				})
				.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						return;
					}
				}).create().show();
	}

	
	/** Se llama al hacer click en el Boton "Fecha" */
	public void ClickFecha(View v) {
		LayoutInflater inf = LayoutInflater.from(this);
		Resources res = getResources();
		
		// layout of alert box contains
		View view = inf.inflate(R.layout.wheeldate, null);

		final WheelView month = (WheelView) view.findViewById(R.id.month);
		final WheelView year = (WheelView) view.findViewById(R.id.year);
		final WheelView day = (WheelView) view.findViewById(R.id.day);

		OnWheelChangedListener listener = new OnWheelChangedListener() {
			public void onChanged(WheelView wheel, int oldValue, int newValue) {
				updateDays(year, month, day);
			}
		};

		// month
		int curMonth = objCalendario.get(Calendar.MONTH);
		String months[] = res.getStringArray(R.array.lb_meses);
		month.setViewAdapter(new DateArrayAdapter(this, months, curMonth));
		// month.setCyclic(true);
		month.setCurrentItem(curMonth);
		month.addChangingListener(listener);

		// year
		final int curYear = objCalendario.get(Calendar.YEAR);
		WheelViewAdapter adapter;
		adapter = new DateNumericAdapter(this, curYear - 3, curYear + 10, 3);
		year.setViewAdapter(adapter);
		// year.setCyclic(true);
		year.setCurrentItem(3);
		year.addChangingListener(listener);

		// //day
		updateDays(year, month, day);
		// day.setCyclic(true);
		day.setCurrentItem(objCalendario.get(Calendar.DAY_OF_MONTH) - 1);

		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_fecha).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						// write code of lines, whatever want to with
						// value of this timepicker
						int dia = day.getCurrentItem() + 1;
						int mes = month.getCurrentItem() + 1;
						int ano = (curYear - 3) + year.getCurrentItem();

						btnFecha.setText(new StringBuilder().append(dia).append("/").append(mes).append("/")
								.append(ano).append(" "));
					}
				})

				.setNegativeButton(R.string.btn_cancelar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						return;
					}
				}).create().show();

	}


	/**
	 * Updates day wheel. Sets max days according to selected month and year
	 */
	void updateDays(WheelView year, WheelView month, WheelView day) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + year.getCurrentItem());
		calendar.set(Calendar.MONTH, month.getCurrentItem());

		int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		day.setViewAdapter(new DateNumericAdapter(this, 1, maxDays, calendar.get(Calendar.DAY_OF_MONTH) - 1));
		int curDay = Math.min(maxDays, day.getCurrentItem() + 1);
		day.setCurrentItem(curDay - 1, true);
	}	

	
	public void btnReconocerVozGlucemia(View view) {
		Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
		intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
		intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Diabeco");
		startActivityForResult(intent, REQUEST_CODE_GLUCEMIA);
	}
	
	
	public void btnReconocerVozNota(View view) {
		Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
		intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
		intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Diabeco");
		startActivityForResult(intent, REQUEST_CODE_NOTA);
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		 if (requestCode == REQUEST_CODE_GLUCEMIA && resultCode == RESULT_OK) {
             String glucemiaValue = "";
             ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
             String firstMatch = matches.iterator().next();
             
             firstMatch = firstMatch.toLowerCase();
             if (firstMatch.contains("glucemia ")) {
                     glucemiaValue = firstMatch.substring(firstMatch.indexOf("glucemia ") + "glucemia ".length());

                     if (glucemiaValue.indexOf(" ") > 0) {
                             glucemiaValue = glucemiaValue.substring(0, glucemiaValue.indexOf(" "));
                     }
             }else {
            	 Toast.makeText(this, "Para dicatado por voz use: glucemia <valor>", Toast.LENGTH_LONG).show();
             }

             EditText editTextGlucemia = (EditText) findViewById(R.id.editTextGlucemia);
             editTextGlucemia.setText(glucemiaValue);
		 }

		 
		 if (requestCode == REQUEST_CODE_NOTA && resultCode == RESULT_OK) {
             String notaValue = "";
             ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
             String firstMatch = matches.iterator().next();
             
             firstMatch = firstMatch.toLowerCase();
             if (firstMatch.contains("nota ")) {
            	 notaValue = firstMatch.substring(firstMatch.indexOf("nota ") + "nota ".length());

//                     if (glucemiaValue.indexOf(" ") > 0) {
//                             glucemiaValue = glucemiaValue.substring(0, glucemiaValue.indexOf(" "));
//                     }
             }else {
            	 Toast.makeText(this, "Para dicatado por voz use: nota <frase>", Toast.LENGTH_LONG).show();
             }

             EditText editTextNotas = (EditText) findViewById(R.id.editTextNotas);
             editTextNotas.setText(notaValue);
     }		 
     super.onActivityResult(requestCode, resultCode, data);
	}
	
	/** PopUp para Mostrar Sugerencias **/
	public void mostrarSugerencia(int idMensaje) {
		
	AlertDialog popup;
	AlertDialog.Builder builder = new AlertDialog.Builder(this);
	 
    builder.setTitle(R.string.titulo_sugerencia);
    builder.setMessage(idMensaje);
    builder.setCancelable(false);
    builder.setIcon(R.drawable.ic_launcher);
    
    	//Boton Aceptar
    	builder.setPositiveButton(R.string.btn_aceptar, new DialogInterface.OnClickListener() {

    		public void onClick(DialogInterface dialog, int position) {
    			Toast.makeText(ActivityRegistroGlucosa.this, "Glucemia Guardada", Toast.LENGTH_SHORT).show();
    			ActivityRegistroGlucosa.this.finish();
    	        dialog.cancel();
    	    	}
        	});

//    	//Boton Cancelar    
//	    builder.setNegativeButton(R.string.btn_cancelar, new DialogInterface.OnClickListener() {
//	    public void onClick(DialogInterface dialog, int which) {
//		        dialog.cancel();
//	    }
//	    });
 
    //Cremos el PopUp y lo mostramos
	popup = builder.create();
	popup.show();		
	}	
}
